import socket

# 任意主机均可连接到该服务器，空字符串表示监听所有可用的网络接口
host = ''
# 服务器监听的端口号，客户端将通过此端口与服务器建立连接
port = 51423

# 建立socket对象
# socket.AF_INET 表示使用 IPv4 地址族
# socket.SOCK_STREAM 表示使用 TCP 协议，提供面向连接的可靠数据传输
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 设置socket选项
# socket.SOL_SOCKET 表示设置的选项位于套接字层
# socket.SO_REUSEADDR 表示允许重用本地地址和端口，即使该地址和端口处于 TIME_WAIT 状态
# 值为 1 表示启用该选项
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 绑定地址和端口
# 将 socket 对象 s 绑定到指定的主机和端口，使服务器开始监听该地址和端口
s.bind((host, port))

print('Waiting for connections...')

# 进行侦听
# 参数 1 表示允许的最大连接队列长度，即最多允许 1 个客户端在队列中等待连接
s.listen(1)

while True:
    # 接受客户端连接
    # accept() 是 socket 对象的方法，它会阻塞程序的执行，直到有客户端尝试连接到服务器
    # 当有客户端连接时，该方法返回一个元组，包含两个元素：
    # 1. clientsock：一个新的 socket 对象，用于与该客户端进行数据通信
    # 2. clientaddr：一个包含客户端地址信息的元组，对于 IPv4 地址，格式为 (host, port)
    clientsock, clientaddr = s.accept()
    print('Got connection from', clientsock.getpeername())
    # 关闭与客户端的连接
    clientsock.close()
